$(document).ready(function(){


1.将json格式的字符串转化成json对象:
  var data=eval('(' + jsonstr + ')');//将json格式的字符串转化成json对象，栗子参看：test_ajax_array.html
  为什么eval('(' + jsonstr + ')')可以实现这个功能？
  原因在于：eval本身的问题。 由于json是以“{}”的方式来开始以及结束的，在JS中，它会被当成一个语句块来处理，
  所以必须强制性的将它转换成一种表达式。
  加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式（expression）转化为对象，
  而不是作为语句（statement）来执行。
  举一个例子，例如对象字面量{}，如若不加外层的括号，那么eval会将大括号识别为JavaScript代码块的开始和结束标记，
  那么{}将会被认为是执行了一句空语句。
2.为什么用.htaccess隐藏了index.php入口以后放在新浪开发者平台上跳转页面死活也找不到页面？
  打开地址 http://suoman.sinaapp.com ，
  看到了“XX网络科技”的首页，以为大功告成，欣喜之余，点开导航的下拉菜单，却发现无法访问文章列表页和文章内容页。
  报错：在服务器上无法访问此URL。
  状态栏显示为"www.suoman.sinaapp.com/x.html"。
  原来是本地开发时隐藏了入口文件index.php，但是SAE无法访问，原因是SAE不支持.htaccess文件。
  所以在SAE上隐藏入口文件时导致SAE无法找到URL。
  没关系，我们可以使用SAE提供的AppConfig服务实现伪静态。
  在你项目的根目录下找到config.yaml文件(没有的话自己建一个)，加上如下代码：
  handle:
  - rewrite: if(!is_dir() && !is_file() && path~"^(.*)$") goto "index.php/$1"
  这样就可以隐藏入口。
2.5.CI布局到SAE上时，数据库database.php中要添加一项：port=>SAE_MYSQL_PORT,注意，没有引号，其他的设置都可以参看
  新浪给出的公用常量
3.居中的话： 
  max-width: 640px;
  margin-left: auto;
  margin-right: auto;
这几句都要有才起作用
4.解决批次号复核中检查所有订单商品数量和种类是否一致的问题（一个发货单对应一个订单，订单可以是合并订单，订单中商品一定要goods_id,style_id完全一样才能算一种商品）
SELECT SUM(goods_number) as goods_number,COUNT(DISTINCT concat_ws('_',goods_id,style_id))as goods_style 
					FROM ecshop.ecs_order_goods og
					inner join romeo.order_shipment os on og.order_id =CAST(os.order_id as UNSIGNED) 
					WHERE os.shipment_id ='100001212'
5.检查套餐是否存在问题
这个问题的解决思路是：先将前台传来的数据组装成数组，拼装传到后台去。后台接到数据后构建一个嵌套的exsist
//检查套餐是否已经存在
if($("#goods_list tr").length==1){
	alert("没有添加商品");
	break;
}
else if($("#comment").val()=="创建"){
	//alert($("#comment").val());
	var good_kinds_num = $("#goods_list tr").length-1;
	var total = new Array();
	var child  = {};
	var array_input=new Array();    //前台的数据放入数组				
	for (var i = 1; i < $("#goods_list tr").length; i++) {
		var goods_id = $("#goods_list tr").eq(i).children().attr("goods_id");
		var style_id = $("#goods_list tr").eq(i).children().attr("style_id");
		var price = $("#goods_list tr").eq(i).find("input[name$='[price]']").attr("value");
		var goods_number = $("#goods_list tr").eq(i).find("td").eq(3).text();
		//console.log(goods_id);
		//var Array1 = {};
		child.goods_id = goods_id;
		child.style_id = style_id;
		child.goods_number = goods_number;
		child.price = price;
		total.push(child);
		child={};				
	}
	console.log(total);
	function if_is_existed(sendData){ //这里使用闭包，访问到内部Ajax返回值
		var is_existed;
			function inner_ajax(){	
				$.ajax({
					async : false,
					dataType : "text",
					//data: total,
					data:"sendData="+sendData,
					url : WEB_ROOT + "admin/ajax.php?act=check_is_existed",
					type : 'POST',
					success : function(response) {	
						//alert(response);
						console.log(response);									
							is_existed=response;
							// alert(is_exited);										
					},
					error: function() { 
						alert('error'); 
					}
				});
				return is_existed;
			}
		return inner_ajax;
	}
	//console.log("这里是数组输出："+ total[0]['goods_id']);
	var sendData = JSON.stringify(total);
	var result = if_is_existed(sendData);
	var TC = result();
	//alert(TC);
	if(TC!=1){
		alert("该套餐已存在，套餐编码为："+TC);
		break;
	}

}
else if($("#comment").val()=="更新"){
	var good_kinds_num = $("#goods_list tr").length-1;
	var total = new Array();
	var child  = {};
	var array_input=new Array();    //前台的数据放入数组				
	for (var i = 1; i < $("#goods_list tr").length; i++) {
		var goods_id = $("#goods_list tr").eq(i).children().attr("goods_id");
		var style_id = $("#goods_list tr").eq(i).children().attr("style_id");
		var price = $("#goods_list tr").eq(i).find("input[name$='[price]']").attr("value");
		var goods_number = $("#goods_list tr").eq(i).find("td").eq(3).text();
		//console.log(goods_id);
		//var Array1 = {};
		child.goods_id = goods_id;
		child.style_id = style_id;
		child.goods_number = goods_number;
		child.price = price;
		total.push(child);
		child={};				
	}
	//console.log(total);
	// var is_exited;
	function if_is_existed(sendData){ //这里使用闭包，访问到内部Ajax返回值
		var is_existed;
			function inner_ajax(){	
				$.ajax({
					async : false,
					dataType : "text",
					//data: total,
					data:"sendData="+sendData,
					url : WEB_ROOT + "admin/ajax.php?act=check_is_existed",
					type : 'POST',
					success : function(response) {	
							//console.log(response);								
							is_existed=response;									
					},
					error: function() { 
						alert('error'); 
					}
				});
				return is_existed;
			}
		return inner_ajax;
	}
	//console.log("这里是数组输出："+ total[0]['goods_id']);
	var sendData = JSON.stringify(total);
	var result = if_is_existed(sendData);
	var finally_result = result();
	// alert($(":input[name='group[code]']").val());
	var code=$(":input[name='group[code]']").val();
	var codeString='"'+code+'"';
	//alert(finally_result);
	// alert(codeString);
	// alert(typeof finally_result);
	// alert(typeof codeString);
	if(finally_result!=codeString && finally_result!= 1){
		alert("该套餐已存在，套餐编码为："+finally_result);
		break;
	}
}
					
后台php处理：
需求变更，验证套餐存在功能弃用
function ajax_check_is_existed($args)
{
    global $db;
    $date=$args['sendData'];
    $slash=stripslashes($date);//这里是用来处理前台传的json数组中的"被转化成\&quot;的问题，如果没有，后台无法通过下标获取值   
    $date2 = json_decode($slash, TRUE);//通过上一步的处理，这里用json_decode将json数组转化成关联数组
    //var_dump($date2);
    //$goods_id = $date2[0]['goods_id'];
    //print_r($goods_id);
    $condition = get_condition($date2);
    $sql = "SELECT distinct group_id, code FROM ecshop.distribution_group_goods dgd WHERE status='OK' ".$condition; 
    //var_dump($sql);
    $result = $db->getAll($sql); 
    // var_dump($result);
    // var_dump($result[0]['group_id']);
    $count=count($result,COUNT_NORMAL);
    $count_create=count($date2,COUNT_NORMAL);
    for ($i=0; $i <$count ; $i++) {
        $group_id=$result[$i]['group_id'];
        $sql2="SELECT count(*) FROM ecshop.distribution_group_goods_item where group_id=".$group_id;
        $count_goods = $db->getCol($sql2);
        if($count_goods[0]==$count_create){
        $code= $result[$i]['code'];
        break;
        }
    }
    if($code){
        return $code;
    }
    else{
        return 1;
    }
}

function get_condition($date2){
        $count=count($date2,COUNT_NORMAL);
        $condition = "";
            for ($i=0; $i <$count ; $i++) { 
                $goods_id = $date2[$i]['goods_id'];
                $style_id = $date2[$i]['style_id'];
                $goods_number = $date2[$i]['goods_number'];
                $price = $date2[$i]['price'];
                $condition .=" and EXISTS (select 1 from ecshop.distribution_group_goods_item where goods_id=".$goods_id." and style_id=".$style_id." and goods_number=".$goods_number." and price=".$price." and group_id=dgd.group_id)";
            }
        return $condition;
    }

});

5.垂直居中方法：
{
      position: absolute;
      top:50%;
      left:50%;
      transform:translate(-255px,-182.5px);
      -webkit-transform:translate(-255px,-182.5px);
      -moz-transform:translate(-255px,-182.5px);
      -ms-transform:translate(-255px,-182.5px);
      -o-transform:translate(-255px,-182.5px);
    }
6.插入商品名字的中存在单引号报错，解决办法是执行sql时多单引号进行转义
用到php方法：mysql_real_escape_string();

7.sql中常常需要将不同的数据类型进行转换，用到函数CAST(expression AS data_type),可以将数据显示的转化为另一种数据类型，如bigint，unsigned等。如：
var a="SELECT SUM(goods_number) as goods_number,COUNT(DISTINCT concat_ws('_',goods_id,style_id))as goods_style 
					FROM ecshop.ecs_order_goods og
					inner join romeo.order_shipment os on og.order_id =CAST(os.order_id as UNSIGNED) 
					WHERE os.shipment_id ='100001212'"

8.sql，show create table *** 查看创建表语句；
		show columns from *** 查看表结构
		show 
9.sql，where **='NULL',表示**字段的值就是NULL;
       where ** is null ，表示**字段什么也没有;

10.firefox 不支持removeAttr("disabled"),如果用jquery版本是1.3.2以上可以使用removeProp("disabled")代替，否则解决办法是用removeAttr("readonly"),
那在之前加入disabled的地方就用attr("readonly","readonly").
11.text-align:center 起作用必须是在子元素没有被float影响的情况下。
12.JAVA hibernate criteria 用法，可以将关键字粘贴至百度搜索，有详细的解说
13.sql优化问题：
$sql_="SELECT p.NAME,s.*
FROM ecshop.cache_postsale_service s
LEFT JOIN romeo.party p ON s.party_id=p.party_id LIMIT 30"
改为
$sql_="SELECT p.NAME,s.*
FROM ecshop.cache_postsale_service s
LEFT JOIN romeo.party p ON CONVERT(s.party_id USING utf8)=p.party_id LIMIT 30"
用explain查看就知道两句sql的效率如何
再来看看表结构：
s.party_id--->int(10);
p.party_id--->varchar(30);
如果不强制转化，出现的结果是：s表中取一个值，p中循环取值转化成int来和s中的值对比;s表中再取一个值，p中循环取值转化成int来和s中的值对比;如此循环下去···
如果转化，出现的结果是：s表中取出一个值，转化成string，p中循环取值来和s的值对比;s表中再取一个值，转化成string，p中循环取值和s中的值对比;如此循环下去···
明显后者节约很多时间。
14.group_concat(order_id SEPARATOR ';')可以将数据库中取出的多个值以分号隔开，如：
$sql_ = "SELECT info.order_id,group_concat(sp.tracking_number SEPARATOR ';') as tracking_number
                FROM `ecshop`.`ecs_order_info` info
                inner JOIN romeo.order_shipment os on convert(info.ORDER_ID using utf8) = os.ORDER_ID
                inner JOIN romeo.shipment sp on os.shipment_id = sp.shipment_id and sp.tracking_number is not null
                WHERE info.order_id in (".$order_ids." ) group by info.order_id ";

15. 如果不能改变后台数据的情况下，想要前台展示部分行合并(如下效果)，则在后台需要一个拼接一个能唯一确定一行的字段，然后构建一个数组
这个数组的key是这个唯一的字段，他的值就是要合并的行数。通过循环比较可以拿到得到每个唯一字段的行数。这个行数就是前台的rowspan的值。
|----|------|
|	   |------|
|----|------|
例子：
后台php：
foreach($claims_settlements as $key=>$item) {
		$compensation_type_key = $item['compensation_type'];
		$claims_settlements[$key]['compensation_type'] = $compensation_type_list[$compensation_type_key];
		$claims_settlements[$key]['can_modify'] = true;
		if($item['created_stamp'] < $date) {
			$claims_settlements[$key]['can_modify'] = false;
		}
		$order_sn_temp = $claims_settlements[$key]['order_sn'];
		$created_stamp_temp = $claims_settlements[$key]['created_stamp'];
		$order_stamp = $order_sn_temp."_".$created_stamp_temp;//构建一个以order_id和created_stamp为下边的数组$row_span，用来存储相同数据有几条
		$claims_settlements[$key]['order_stamp']= $order_stamp;
    	if(isset($row_span[$order_stamp]) && ($row_span['order_sn'] == $order_sn_temp) && ($row_span['created_stamp'] == $created_stamp_temp)){
    		$row_span[$order_stamp] = $row_span[$order_stamp] + 1; 
		}else{
    		$row_span[$order_stamp] =  1;
    		$row_span['order_sn'] =  $claims_settlements[$key]['order_sn'];
    		$row_span['created_stamp'] =  $claims_settlements[$key]['created_stamp'];
    	}
	}
前台smarty：
 <!-- {foreach from=$claims_settlements item=claims_settlement} -->
  {assign var=order_sn1 value=$claims_settlement.order_stamp}
  {if $row_span.$order_sn1 != 1}
    <tr id="{$claims_settlement.compensation_id}" style="background:rgba(118, 117, 117, 0.4);">
  {else}
    <tr id="{$claims_settlement.compensation_id}">
  {/if}
   
  {if $pre_order_stamp != $claims_settlement.order_stamp}
  {assign var=order_stamp value=$claims_settlement.order_stamp}
    <td rowspan="{$row_span.$order_stamp}">{$claims_settlement.created_stamp}</td> 
    <td rowspan="{$row_span.$order_stamp}"><a href="order_edit.php?order_id={$claims_settlement.order_id}" target="_blank">{$claims_settlement.order_sn}</a></td>
    <td rowspan="{$row_span.$order_stamp}">{$claims_settlement.party_name}</td>
    <td rowspan="{$row_span.$order_stamp}">{$claims_settlement.compensation_type}</td>
  {else}
  {/if}
   <td>{$claims_settlement.distributor_name}</td>
   </tr>
{assign var=pre_order_stamp value=$claims_settlement.order_stamp}
<!-- {/foreach} -->
16.一个标准的ajax书写样例：
function getSampleRegion (parent_id,child_selector,callBack) {
		$.ajax({
			url:"region_info.php?parent_id="+parent_id,
			type:"GET",
			data: "parent_id="+parent_id,
			dataType:"json",
			beforeSend : function(xhr) {  
				//花式转菊花
			},
			success:function(data) {
				console.log(data);
				var regionsHtml = "<option value='-1'>请选择</option>";
				for(var key in data.sub_region_list) {
					regionsHtml += "<option value='" + data.sub_region_list[key].region_id + "'>" + data.sub_region_list[key].region_name + "</option>";
				}

				$(child_selector).html(regionsHtml);
				if (callBack) {
					callBack();
				}
			},
			error:function(error) {
				console.log(error);
			}
		});
	}
17.Smarty中elseif中间没有空格
{if}
{elseif}
{else}
{/if}

18.php中删除数组中的项的方法：
(1)unset()--->不会更新索引
(2)array_splice()--->更新索引

19.做提示框可用插件overlib
20.定义一个数组，数组的名字叫Array会报错
21.如果使用$ajax方式传参数，则data："data="+sendData,等号不能少！！
22.ajax的data数据有多重写法，下面是对象的格式。
(1)对象
$.ajax({
               type:'post',
               dataType:'json',
               data:{
                 'order_id':order_id,
                 'taobao_order_sn':taobao_order_sn,
                 'order_sn':order_sn,
                 'facility_id':facility_id
               },
               url:'order_edit.php?act=bird_cancel',
               success:function(data){
                   console.log('成功');
                   if(data.flag =='SUCCESS'){
	               		can_cancel = true;
	               		alert('取消成功');
	               		 $('#pop').hide();
	               	}else if(data.flag =='ERROR'){
	               		alert("取消订单失败！"+data.message);
	               		$("#closeActTab").trigger("click");
	               	}
               },
               error:function(){
                   console.log('失敗');
               }
             });
后台直接用$_REQUEST获取：
$taobao_order_sn = $_REQUEST['taobao_order_sn'];
$facility_id = $_REQUEST['facility_id'];
$order_sn = $_REQUEST['order_sn'];
(2)数组
if($("#goods_list tr").length==1){
    alert("没有添加商品");
    break;
   }
   else {
    var good_kinds_num = $("#goods_list tr").length-1;
    //alert(good_kinds_num);
    // var total = {};
    var total = new Array();
    var child  = {};
    // var child = new Array();
    var array_input=new Array();    //前台的数据放入数组
    // for(var i=0;i< good_kinds_num;i++){
     // array_input[i]=new Array();
     // for(var j=0;j<3;j++){
     //  array_input[i][j]=1;
      // } 

    for (var i = 1; i < $("#goods_list tr").length; i++) {
     var goods_id = $("#goods_list tr").eq(i).children().attr("goods_id");
     var style_id = $("#goods_list tr").eq(i).children().attr("style_id");
     var goods_number = $("#goods_list tr").eq(i).find("td").eq(3).text();
     //console.log(goods_id);
     //var Array1 = {};
     child.goods_id = goods_id;
     child.style_id = style_id;
     child.goods_number = goods_number;
     total.push(child);
     //child.length = 0;     
    }
    console.log(total);
    console.log("这里是数组输出："+ total[0]['goods_id']);
    var a =JSON.stringify(total);//这里是关键，
    // console.log(array_input);    
    // var sendData=JSON.stringify(array_input);
    // console.log(sendData);
    //is_exited(goods_id);
    // event.preventDefault();
    $.ajax({
     async : false,
     dataType : "text",
     //data: total,
     data:"a="+a,
     url : WEB_ROOT + "admin/ajax.php?act=check_is_exited",
     type : 'POST',
     success : function(response) { 
      console.log(response);

     },
     error: function() { 
      alert('error'); 
     }
    });
    }
后台要经过处理 $slash=stripslashes($date);$goods_id = $date2[0]['goods_id'];才能使用：
function ajax_check_is_exited($args)
{
    global $db;
    if(is_array($args)){echo "1223";}
    else{echo "zlp";}
    $date=$args['a'];
    $slash=stripslashes($date);

   $date2 = json_decode($slash, TRUE);
   //var_dump($date2);
   $goods_id = $date2[0]['goods_id'];
   //print_r($goods_id);
    global $db;
    return $goods_id;   
}
(3)最常见的是直接传字符串，变量之间用&隔开
 var data = 'from_data='+ $from_shipping_id+ '&party_id='+ $party_id+ '&facility_id='+ $facility_id;
                $.ajax({
                    type:"POST",
                    dataType:'json',
                    url:"ajax.php?act=search_from_carrier_shipment_number",
                    data:data,
                    beforeSend:function(){
                        $("#load1").siblings().fadeOut("slow");
                        $("#load1").slideDown("slow");
                    },
                    success:function(data){
                        //alert(data.confirm);
                        $("#shipment_num").siblings().fadeOut("slow");
                        $("#shipment_num").html("<p>共有"+ data.shipment_number+"个订单,耗时"+data.cost_time+"秒</p>").fadeIn("slow");
                    },
                    error:function(){
                        $("#error1").siblings().fadeOut("slow");
                        $("#error1").fadeIn("slow");
                    }
                });
23.如果id选择器的id是一个变量，用下面方法获取元素
	var span=$('#'+refund_id);
24.如果想要改变图片的颜色，可以使用灰度来控制，就不需要两张图片了-webkit-filter: grayscale(100%);
25.php,break 2;可以跳出两重循环
26.php,bccomp(),比较两个字符串的大小
27.JS中p.innerHTML=""的写法和jquery中p.html("")方法相对
29.获取一个table的行数：$("#good_list tr").length;
30.移除table中的第i行：$("#good_list tbody tr").eq(i).empty();
31.清空表单： 
	$(":input","#group_detail_form")
	.not(":button,:sumbmit,:reset,:hidden,:radio")
	.val("")
	.removeAttr('checked')
	.removeAttr('selected');
32.获取到同一行的表格元素的value：var order_sn= $(obj).closest('tr.list').find('.check').attr('value');
	closest()获得匹配选择器的第一个祖先元素，从当前元素开始沿 DOM 树向上
33.(1)js阻止冒泡事件:
	var el = window.document.getElementById("a");
    el.onclick = function (e) {
        if (e && e.stopPropagation) {//非IE
            e.stopPropagation();
        }
        else {
            window.event.cancelBubble = true;//IE
            return false;
        }
    }
    (2)js阻止默认事件：
    var el = window.document.getElementById("a");
    el.onclick = function (e) {
        if (e && e.preventDefault) {
            e.preventDefault();//非IE
        }
        else {
            window.event.returnValue = false;//IE
            return false;
        }
    }
    (3)jquery：
    $("a").click(function (e) {
        e.stopPropagation();
    });
    $("a").click(function (e) {
        e.preventDefault();
    });
34.a标签阻止跳转<a href="javascript:void(0);" onclick="group_remove(this);">删除</a>
35.<input type="text" autofocus="autofocus"/>
36.<button  value="test"></button>和<input type="button"  value="test"> 的区别:
	(1)在IE9中如果获取两者的值，前者的值不是test，而是"按钮"。
	(2)<input type="submit"/>表单提交时，所有具有name属性的html输入元素(包括input标签、button标签、select标签等)
	都将作为键值对提交,除了Submit对象。Submit对象只有在自己被单击后的提交中才会作为键值对被提交。这是二者的本质区别。
	所以如果在HTML表单中错把<button></button> 元素当成<input type="submit"/>，也会发生表单的提交，不同的浏览器会提交不同的值：
	Internet Explorer 将提交 <button> 与 <button/> 之间的文本，
	而其他浏览器将提交 value 属性的内容。
	所以，在HTML 表单中一定要使用 input 元素来创建按钮。
37.<input type="submit"/>和<input type="button"/>的区别:
	type=button 就单纯是按钮功能 
　　type=submit 是发送表单
	(1)<input type="submit"/>将表单提交(form.submit())作为其onclick后的默认事件，<input type="button"/>并非如此
　　(2)<input type="submit"/>表单提交时，所有具有name属性的html输入元素(包括input标签、button标签、select标签等)
	都将作为键值对提交,除了Submit对象。Submit对象只有在自己被单击后的提交中才会作为键值对被提交。这是二者的本质区别。
	所以如果在HTML表单中使用错把<button></button> 元素当成<input type="submit"/>，也会发生表单的提交，不同的浏览器会提交不同的值：
	Internet Explorer 将提交 <button> 与 <button/> 之间的文本，
	而其他浏览器将提交 value 属性的内容。
	所以，在HTML 表单中一定要使用 input 元素来创建按钮。
38.php，$res=$db->getCol($sql),getCol()执行一条sql语句，并获取这个字段的值，返回一个数组
39.(1)php中trim()方法可以从字符串的两端删除空白字符串和其他预定义字符串
	(2)jquery：中$.trim(str)的作用是去掉字符串首尾空格，但是要注意，trim()前面有个$符号,事实上jquery中有两个方法：jquery.trim(),trim()
	如下在IE8以下中会报错
	<input type="text" name="" id="results" value=""/> 
	var content = $('#content').val(); 
	if(content.trim() == '') 
	alert('空'); 
	所以一定要写成：
	<input type="text" name="" id="results" value=""/> 
	var content = $('#results').val(); 
	if($.trim(content) == '') 
	alert('空');
	(3)js并没有这种方法，只能自己定义，也有多种方法
	1)最常见的方法，正则表达式
		String.prototype.Trim = function()  
		{  
		return this.replace(/(^\s*)|(\s*$)/g, "");  
		}  
		String.prototype.LTrim = function()  
		{  
		return this.replace(/(^\s*)/g, "");  
		}  
		String.prototype.RTrim = function()  
		{  
		return this.replace(/(\s*$)/g, "");  
		}
	2)js循环检查替换
//供使用者调用  
function trim(s){  
    return trimRight(trimLeft(s));  
}  
//去掉左边的空白  
function trimLeft(s){  
    if(s == null) {  
        return "";  
    }  
    var whitespace = new String(" \t\n\r");  
    var str = new String(s);  
    if (whitespace.indexOf(str.charAt(0)) != -1) {  
        var j=0, i = str.length;  
        while (j < i && whitespace.indexOf(str.charAt(j)) != -1){  
            j++;  
        }  
        str = str.substring(j, i);  
    }  
    return str;  
}  

//去掉右边的空白   
function trimRight(s){  
    if(s == null) return "";  
    var whitespace = new String(" \t\n\r");  
    var str = new String(s);  
    if (whitespace.indexOf(str.charAt(str.length-1)) != -1){  
        var i = str.length - 1;  
        while (i >= 0 && whitespace.indexOf(str.charAt(i)) != -1){  
           i--;  
        }  
        str = str.substring(0, i+1);  
    }  
    return str;  
}
40.IE6的浮动元素的浮动方向和浮动边界的方向一致时的双边距bug的修复方案:
	.floatbox { //float: left; + margin-left;在IE6中就会出现双边距bug
	float: left; 
	width: 150px; 
	height: 150px; 
	margin: 5px 0 5px 100px; 
	}
	(1)给浮动元素加上display:inline;参看：http://www.cnblogs.com/ndxsdhy/archive/2011/01/25/1944872.html
	.floatbox { 
	float: left; 
	width: 150px; 
	height: 150px; 
	margin: 5px 0 5px 100px;
	display: inline; //加上这句就能解决 
	}
	(2)使用_margin的兼容写法,参看：http://blog.csdn.net/evangel_z/article/details/8114154
	.floatbox { 
	float: left; 
	width: 150px; 
	height: 150px; 
	margin: 5px 0 5px 100px;
	_margin: 15px 0 5px 50px;  //对IE6
	}
41.	为什么要 eval这里要添加 “("(" + data + ")");” 呢？
	原因在于：eval本身的问题。 由于json是以“{}”的方式来开始以及结束的，在JS中，它会被当成一个语句块来处理，所以必须强制性的将它转换成一种表达式。
	加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式（expression）转化为对象，而不是作为语句（statement）来执行。
	举一个例子，例如对象字面量{}，如若不加外层的括号，那么eval会将大括号识别为JavaScript代码块的开始和结束标记，那么{}将会被认为是执行了一句空语句。
42.	为什么用.htaccess隐藏了index.php入口以后放在新浪开发者平台上跳转页面死活也找不到页面？
	打开地址 http://suoman.sinaapp.com ，看到了“XX网络科技”的首页，以为大功告成，欣喜之余，
	//点开导航的下拉菜单，却发现无法访问文章列表页和文章内容页。报错：在服务器上无法访问此URL。
	//状态栏显示为"www.suoman.sinaapp.com/x.html”。原来是本地开发时隐藏了入口文件index.php，
	//但是SAE无法访问，原因是SAE不支持.htaccess文件。所以在SAE上隐藏入口文件时导致SAE无法找到URL。
	//没关系，我们可以使用SAE提供的AppConfig服务实现伪静态。在你项目的根目录下找到config.yaml文件(没有的话自己建一个)，加上如下代码：
	handle:
	- rewrite: if(!is_dir() && !is_file() && path~"^(.*)$") goto "index.php/$1"
	这样就可以隐藏入口。
43.引入jquery时发生，对象不支持“addEventListener”属性或方法/SCRIPT5009: “JSON”未定义 问题
	解决办法：
	1)请查看jquery版本；
	2)jQuery 2.x 已经不支持IE9以下的IE浏览器，如果你想继续支持IE6/7/8，请使用jQuery 1.x版本
	3)如果要兼容 IE 6/7/8/9/10...建议1.x和2.x版本切换使用
   	4)1.x和2.x版本切换使用方法:
	  <!--[if !IE]> -->
	  <script src="http://cdn.bootcss.com/jquery/2.2.0/jquery.min.js"></script>
	  <!-- <![endif]-->
	  <!--[if IE]>
	      <script src="http://cdn.bootcss.com/jquery/1.12.0/jquery.js"></script>
	  <![endif]-->
44.浏览器的内核分别是什么?
	IE:Trident
	Mozilla:Gecko
	Chrome:Blink（WebKit的分支）
	Opera内核原为Presto，现为Blink;
45.<fieldset>组合表单中的相关元素，<legend>是<fieldset>的标题
46.blur()方法可以指定逝去焦点的事件
47.使下拉列表的第2,3项选中：
	$("#xx").val(["选择号1","选择号2"]),括号的以数组的形式
48.children()方法只考虑子元素而不考虑后代元素
49. parent()-->直接从父元素开始查找，返回第一个节点
	 parents()-->找到第一个节点后继续查找，返回多个节点 
	 closest()-->从自身开始找，返回匹配的第一个元素
50.git上传教程
	1)在git.oschina.net上新建一个远程仓库(就是新建一个项目)
	2)右键-->Git Bash here 
	3)键入git clone url(这个url是之前新建项目那里复制来的)
	4)键入git add *(所有文件都提取到缓冲区里,用 git status 可以查看状态)
	5)键入git commit-m "提交日志"(提交到git本地库中)
	6)键入 git push origin master(origin-->查看远程分支：git remote show;master-->查看本地分支：branch)
51.toggleClass('selector')控制样式的重复切换
52.jquery的ajax函数可以传入3种数据
	1)文本或者叫字符串："usme=alice&birthday=1903-05-12"
	2)json对象：{uname：'alice',birthday:'1903-05-12'}
	3)json数组：[{"name":"uname","value":"alice"},
				 {"name":"birthday","value":"1903-05-12"}]
53.如果有的按钮，控件显示不出，或者是一直html的第一行报错，很可能是由于成对的标签只写了一个或者其他书写不规范引起的错误
54.如果button放在页面的form中，如果没有设置，则button会默认将表单提交到当前页面，如果想要阻止默认事件发生，可以使用event.preventDefault()
	$("#btn_start").on("click(function(event) {
		event.preventDefault();
		// some code
	});")
55.选取id="myModal"的div中所有的select
	$("#myModal select").val("-1");
56.sql把时间戳变成日期格式
  select FROM_UNIXTIME(info.confirm_time) as confirm_time from **
57.如果数据条数太多，需要将数据先分组进行处理，则参看下面代码。$group_num是计算处的组数，每组的序号$j=500*$i是到$j <= 500*$i+499;利用双重循环来做
  $group_num = floor(($count-1)/500)+1;
   for ($i=0; $i < $group_num; $i++) { 
      $order_ids_group = array();
          for ($j=500*$i; $j <= 500*$i+499; $j++) {
              if($ref_fields_orders['order_id'][$j] != NULL) {
                  $order_ids_group[$j] = $ref_fields_orders['order_id'][$j]; 
                }    
          }
    }
58. slideToggle(slow/400/fast)纵向隐藏
    Toggle()横向隐藏
    slideUp(slow/400/fast)向上隐藏
59.js中unshif()向数组的开头添加一个或者更多元素，返回新长度
60.radio button 的name一定要一样才能成为一组
61.使用属性选择器来选择radio button
  eg.$radio = $("input[name='radio']:checked");
62.php mysql_num_rows() 可以得到结果集中的行数
  PDO 中rowCount也可以
63.如果ajax不执行success中的代码，直接跳到error里，可能是返回的数据无法解析成dataType中要求的格式，
  这时候也许要换一种格式，或者检查返回数据是否正确。
64.js for(variable in [object/array]);
  1)当遍历的是对象object的时候，variable值取到的是对象中的key值
    eg：
      var obj = {"name":"zlp","age":"25","sex":"女"};
      for(var j in obj){
        document.write("属性名："+j+"-->值："+obj[j]+"<br>");
      }
    结果：
        属性名：name-->值：zlp
        属性名：age-->值：25
        属性名：sex-->值：女
  2)当遍历的是数组array的时候，variable值取到的是数组的依次的索引值
    eg:
      var obj = ["a","b","c","d"];
      for(var j in obj){
        document.write("索引"+j+"："+obj[j]+"<br>");
      }
    结果：
        索引0：a
        索引1：b
        索引2：c
        索引3：d
65.php implode()把数组元素合并成一个字符串
66.php循环获取get/post过来的数据并存成数组：
  foreach($_GET as $key=>$value){
    $_GET.date[]=$key."='".$value."'";
    //echo $key."=>".$value."\n";
  }
67.想要一个长图实现滑动，上面很多链接，绝对定位
  1)最外层div宽高：100%*100%;
  2)中间层div：position：relative，此时这个div的高度是长图的高度
  3)最里面放长图，图上的链接可以进行相对图片定位了
68.懒加载的关键：
  1)div.scrollTop+window.height=div.offsettop时，div开始出现(div.scrollTop从0开始不断增大，window.height，div.offsettop不变)
  2)当div.scrollTop=div.affsettop时，div到达页面顶端
69.js 如果想做出'更多','收起'的按钮，只能用input
  <input type='button' value="更多" id="wrap"/>
  用js更改input的value="收起"
  document.getElementById("wrap").value="收起";
70.js location 对象中pathname属性。可以获取网址中除网站的文件名的url
71.js indexOf 方法，检索字符串出现的位置，如果没有找到则返回-1
72.if(a,b,c),a为true,则取b，否则取c
73.去掉table的两条线：border-collapse：collapse
74.css可以利用border属性构造三角形，主要思路是：
  1)一个div，有border-right
  2)如果div的宽度为0，则是一个三角形
75.chrome下按ctrl+D,匹配的单词会选中，
    shift+click,可以在不同的形式的颜色表示中切换
76.每一个function都有一个argument对象，用于存储传入的参数，length是argument的一个属性，但这个属性是只读的
    argument还有一个callee属性，应用当前函数，实现引用自身
    eg： 
    var factorial = function(n){
      if(n<2){
        return 1;
      }else{
        return n*arguments.callee(n-1);
      }
    }
77.如果需要一次设置多个属性，则采用key/value的形式
  eg：$("p").attr({"title":"your title","name":"test"});
78.$(this).clone(true).appendTo('body');
  clone()方法中穿了参数true，代表复制元素的同时复制元素中绑定的事件
79.3种删除节点的方法：
  1)remove()删除后可再用，但绑定事件不在
  2)detach()删除后可再用，但绑定事件还在
  3)empty()清空，只剩下默认便签
80.json字符串====>json对象，参看：test_ajax_array2.html
  json字符串：var data = '[{"a00":53,"a01":55,"a02":82},{"a10":68,"a11":53,"a12":26},{"a20":95,"a21":67,"a22":76}]';
  要将其转化成json对象，即object，js可以使用一下方法：
  var dataObj = eval("("+data+")");
  通过浏览器就可以看到dataObj变成了object了
81.ajax中data：{"name":"a","age":"55","sex":"female"}
  这样的形式是传递类格式的json对象
  如果传递多个类，如[{"name":"a","age":"55"},{"name":"b","age":"55"},{"name":"c","age":"55"}],
  这就是数组,则无法传递,可以用eval把数组转化成对象(参看80),也可以使用JSON.stringify转化成字符串再传递
            stringify(obj)
  json 对象------------->json 字符串
           <-------------
            parse(string)
82.JSON.stringify(value,filter,index),@value传入数据 @filter过滤器：数组或者函数@index如果是数字代表替代空白的个数，也可以是特殊字符
83.php中可用json_encode()函数将数组格式转化成json
84.PDO 用fetchAll(PDO::FETCH_ASSOC)取回的数据是关联*数组*，所以如果要使用json格式的，还需要将数据转化成json数据
85. include(_once)("文件路径")，如果找不到会报错warning，程序继续执行
    require(_once)("文件路径")，如果找不到会报fatal error，程序停止执行
86.遍历方法
    jquery：each
    js：for
    php：foreach
87.当把select语句应用到exec时，总是返回0
88.PDOstatement::fetchColumn()从结果集的下一行获取第二列
   PDOstatement::rowCount()返回受上一个sql语句影响的行数，此方法只适用于delete，insert，update语句
89.this 和 event.target(ie:window.event.srcElement)比较
    两个都是DOM对象
    this可变
    event.target，不可变，指接受事件的目标DOM元素
90.comfirm(""),如果用户点击是，confirm返回true，否则返回false
91.子元素：只限下一层级有才行
  后代元素：包含所有，不只是下一个层级
92.lable for=""表示是哪个id的元素的lable
93.placeholder 搜索框中灰色的小字
94.#("")获取的永远都是对象，即使网页上没有这个元素，所以使用jquery检查网页上是否存在某个元素
  不能使用：
  if($("##")){}
  应该使用：
  if($("##").length>0){}
  文本或者叫字符串：
  if($("##")[0]){}
95.<option value="123">456</option>
  $("#**Id option:selected").attr("value"),获取属性value的值，结果：123
  $("#**Id option:selected").val(),获取option显示的值，结果：456

96.ERP中添加页面步骤：
  1)inc_menu.php中添加页面
  2)ERP/languges/zh_cn/admin/common.php

97.如果遇见svn提交的列表中不出现从其他的项目中拷过来的文件，则说明svn中有相关的提交信息，
需要将文件的隐藏文件全部显示，然后删除所有.svn的文件

98.数据库从2.11切换到0.22，订单详情页的会因为party_id不一致报错，解决办法：
  1.admin/bwshop/lib_bw_party.php
    public static function getBWRootPartyId(){
    return 65651;//For 2.11
    // return 65658;//For 0.22
  }
  2.order_edit.php
      // $sql_party_ids = "select party_id from romeo.party where PARENT_PARTY_ID = '65658'";
    $sql_party_ids = "select party_id from romeo.party where PARENT_PARTY_ID = '65651'";

99.可以退款申请的订单转态是：已确认 预定成功 已付款 待配货

100.select的option除了可以用foreach循环来赋值，也可以用如下方法赋值
<select name="responsible_party[]"  onchange="responsibleChange(this)">
    <option value="0">--请选择--</option>{html_options options=$responsible_party_list}
</select>

101.subline中全文搜索是ctrl+P,eclipse中是ctrl+shipt+R

102.after() 和 append()的区别
  after()是在所选的元素的后面加
  append()是在所选元素的里面加

103.jQuery中如果想要实时监听input值可以使用 oninput & onpropertychange 
js：
    // Firefox, Google Chrome, Opera, Safari, Internet Explorer from version 9
        function OnInput (event) {
            alert ("The new content: " + event.target.value);
        }
    // Internet Explorer
        function OnPropChanged (event) {
            if (event.propertyName.toLowerCase () == "value") {
                alert ("The new content: " + event.srcElement.value);
            }
        }

html：
    Please modify the contents of the text field.
    <input type="text" oninput="OnInput (event)" onpropertychange="OnPropChanged (event)"

104.又一个ajax字符串拼接的例子
      $("#print_tag").on('click', function(event) {
        event.preventDefault();
        var tagList= "";
        var tr = $(".list").length;

        var tagInfo="";
        tagList="{[";

        for (var i = 0; i < tr; i++) {
          var oms_order_sn = $('#oms_order_sn').val(); 
          var physical_warehouse_id = $(".list").eq(i).find('.physical_warehouse_id_copy').val(); 
          var barcode = $(".list").eq(i).find('.barcode_copy').val();
          var goods_name = $(".list").eq(i).find('.goods_name_copy').val();         
          var order_goods_id = $(".list").eq(i).find('.order_goods_id_copy').val();

          var normal_number = $(".list").eq(i).find('.normal_number').val();
          var defective_number = $(".list").eq(i).find('.defective_number').val();
          var validity = $(".list").eq(i).find('.validity_').val();
          var location_barcode = $(".list").eq(i).find('.tag_').val();
          if (location_barcode == "") {
            alert("便签条码不能为空");
            return;
          }
          if (normal_number=="" && defective_number=="") {
            alert("良品和不良品不能同时为空");
            return;
          };
          // var tagInfo_new= {};


          tagInfo += "{'location_barcode':'"+location_barcode+"'"+
          ",'normal_number':'"+normal_number+"'"+
          ",'defective_number':'"+defective_number+"'"+
          ",'validity':'"+validity+"'"+
          ",'order_goods_id':'"+order_goods_id+"'"+
          ",'physical_warehouse_id':'"+physical_warehouse_id+"'"+
          ",'oms_order_sn':'"+oms_order_sn+"'"+
          ",'goods_name':'"+goods_name+"'"+
          ",'barcode':'"+barcode+"'"+
          "},";
        tagList += tagInfo;
      }
      tagList = tagList.substring(0,tagList.lastIndexOf(','));
      tagList += "]}";
      console.log(tagList);
      });

105.实现点击按钮出现一个打印窗口的实现方法：
 1.页面中加入iframe,src内容为空
 <iframe id="print" src=""></iframe>
 2.要在iframe中显示的页面中加入
 <body onLoad="window.print()">
 3.ajax的success函数中给src复制
  src="print?tracking_number="+JSON.stringify(tagList);
  $('#print').attr('src',src); 
